package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.Strategy;
import cn.wolfcode.wolf2w.domain.StrategyComment;
import cn.wolfcode.wolf2w.exception.LogicException;
import cn.wolfcode.wolf2w.query.StrategyCommentQuery;
import cn.wolfcode.wolf2w.repository.StrategyCommentRepository;
import cn.wolfcode.wolf2w.service.IStrategyCommentService;
import cn.wolfcode.wolf2w.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 攻略分类业务层的实现类
 */
@Service
public class StrategyCommentServiceImpl implements IStrategyCommentService {

    //  注入StrategyCommentRepository持久层接口
    @Autowired
    private StrategyCommentRepository strategyCommentRepository;

    //  注入MongoTemplate服务
    @Autowired
    private MongoTemplate mongoTemplate;

    //  插入单个方法
    @Override
    public void insert(StrategyComment strategyComment) {

        //  id自动生成，手动设置为空
        strategyComment.setId(null);
        strategyComment.setCreateTime(DateUtil.getTime());

        //  调用持久层接口的save方法执行插入单个目的地对象
        strategyCommentRepository.save(strategyComment);

    }

    //  删除单个方法
    @Override
    public void deleteById(String id) {

        //  调用持久层接口的deleteById方法执行删除单个目的地对象
        strategyCommentRepository.deleteById(id);
    }

    //  修改单个方法
    @Override
    public void updateById(StrategyComment strategyComment) {

        //  调用持久层接口的save方法执行修改单个目的地对象
        strategyCommentRepository.save(strategyComment);
    }

    //  查询单个方法
    @Override
    public StrategyComment selectById(String id) {

        //  调用持久层接口的findById方法执行查询单个目的地对象
        return strategyCommentRepository.findById(id).orElse(null);
    }

    //  查询所有方法
    @Override
    public List<StrategyComment> selectAll() {

        //  调用持久层接口的findAll方法执行查询所有目的地对象
        return strategyCommentRepository.findAll();
    }

    //  分页方法
    @Override
    public Page<StrategyComment> query(StrategyCommentQuery qo) {

        //  查询对象
        Query query = new Query();

        if (StringUtils.hasLength(qo.getStrategyId())) {
            query.addCriteria(Criteria.where("strategyId").is(qo.getStrategyId()));
        }

        //  调用mongodb服务中的count方法
        //  传入上面的查询对象和StrategyComment的字节码对象
        //  返回一个满足条件的总记录数
        long totalCount = mongoTemplate.count(query, StrategyComment.class);

        //  若查询出来的总记录数为零时
        if (totalCount == 0) {

            //  直接返回一个空集合
            return Page.empty();
        }

        //  调用Pageable的of方法
        //  传入qo对象的当前页，qo对象的当前页显示的最大记录数，排序的顺序，通过_id来排序
        Pageable pageRequest = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "createTime");

        //  把限制条件加入到查询对象中
        query.with(pageRequest);

        //  调用mongodb服务中的find方法
        //  传入上面的查询对象和StrategyComment的字节码对象
        //  返回一个满足条件的目的地对象的集合数据
        List<StrategyComment> strategyComments = mongoTemplate.find(query, StrategyComment.class);

        //  返回一个PageImpl的集合
        //  传入一个满足条件的目的地对象的集合数据对象
        //  传入限制条件
        //  返回一个满足条件的总记录数
        return new PageImpl<>(strategyComments, pageRequest, totalCount);
    }

    //  攻略评论点赞/取消点赞方法
    @Override
    public void commentThumb(String uid, String cid) {
        //  通过该评论id拿到被点赞的评论对象
        StrategyComment strategyComment = this.selectById(cid);

        //  判断该被评论的对象是否存在
        if (strategyComment == null) {
            throw new LogicException("该评论不存在");
        }

        //  若存在，则获取存储点赞的用户id的集合
        List<String> thumbuplist = strategyComment.getThumbuplist();
        //  判断该用户是否点赞
        if (thumbuplist.contains(uid)) {
            //  若集合中存在该点赞的用户id，则说明该用户已经点赞
            //  所以，将点赞数减一
            strategyComment.setThumbupnum(strategyComment.getThumbupnum() - 1);
            //  将集合中的点赞的用户id移除
            thumbuplist.remove(uid);
            //  反之
        } else {
            strategyComment.setThumbupnum(strategyComment.getThumbupnum() + 1);
            thumbuplist.add(uid);
        }

        //  更新数据
        this.updateById(strategyComment);
    }

}
